// 脚本文件，用于执行开发环境的打包构建

import minimist from "minimist"; // 这里使用了es6的模块化导入，需要在package.json中加入一个字段 "type": "module"，否则会报错
import { fileURLToPath } from "url";
import { dirname, resolve } from "path";
import { createRequire } from "module";
import esbuild from "esbuild";

const require = createRequire(import.meta.url);

// 读取命令行命令参数
const argv = process.argv.slice(2);
// process.argv
// [
//     'D:\\Data\\Node\\node.exe',
//     'D:\\360Downloads\\miniVue\\script\\dev.js',
//     'reactivity',
//     '-f',
//     'esm'
//   ]

// 解析参数
const args = minimist(argv);
//  { _: [ 'reactivity' ], f: 'esm' }

const target = args._[0] || "reactivity"; // 打包的模块名
const format = args.f || "esm"; // 打包的格式，默认是esm

// 读取package.json
// const pkg = require(`../packages/${target}/package.json`)

// 获取__dirname 的路径（因为在esm模块中是无法直接使用__dirname的）
const fileUrl = import.meta.url; // 读取当前文件的url
const __filename = fileURLToPath(fileUrl);
const __dirname = dirname(__filename);

// 入口文件路径
const entry = resolve(__dirname, `../packages/${target}/src/index.ts`);

const pkg = require(`../packages/${target}/package.json`);

// 开始打包
esbuild.context({
    entryPoints: [entry], // 入口文件
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), // 打包出口
    platform: "browser", // 打包环境（打包完的代码运行平台）
    sourcemap: true, // 可以调试源代码
    format: format, // 打包格式
    /**
     * cjs： 打包成commonjs格式
     * esm： 打包成es模块
     * iife： 打包成自执行函数（打包位自执行函数时需要为该函数变量命名）
     */
    bundle: true, // 讲所引文件打包成一个文件
    globalName: pkg.buildOptions?.name, // 打包名称
  })
  .then((ctx) => {
    console.log(`${target}打包完成`);
    return ctx.watch(); // 监听文件变化
  });
